import sched

import threading
import os
import random
import time
from multiprocessing import Queue

"""
多线程的设计: 
    import threading
    多线程相比多进程的区别:
        多线程更加轻量化,使得io处理更加迅速
        
    # 面向对象的设计模式
        继承Thread类,重写run()方法
        设置守护进程,thread.setDaemon(True)
    
    # lock模块存在的问题
    上了几次锁就要解锁几次,就很不方便
    于是出现了rLock --- 一次解除所有锁
            
# 调度sched
    安排,指定程序在什么时候去执行,
    这里的调度只能实现时间间隔调度,
    如果是指定时间调度就要配合其他模块


# 生产者消费者
    生产一个消费一个
    没有产品就阻塞 
    
# Condition 
    有点像event, 
           
"""


# 模型: 两个人吃火锅,
#           a往火锅里加火锅丸子, 锅里的丸子数<=5
#           通知b来吃   锅里的丸子数=0
#           通知a加丸子

num = 0 # 丸子数量
class Productor(threading.Thread):
    def __init__(self,name,con):
        super().__init__(name=name)
        self.__con =con

    def run(self) -> None:
        self.__con.acquire() # 获取进程,别的进程等待
        global num
        while True:
            num+=1
            print('[{}]放一个丸子现在锅里丸子有{}个'.format(threading.current_thread().name,num))
            time.sleep(1)
            if num==5:
                print('锅里满了...')
                self.__con.notify()
                self.__con.wait()



class Customer(threading.Thread):
    def __init__(self,name,con):
        super().__init__(name=name)
        self.__con = con

    def run(self) -> None:
        self.__con.acquire()
        global num
        while 1:
            num-=1
            time.sleep(2)
            print('[{}]吃一个丸子锅里还有{}'.format(threading.current_thread().name,num))
            if num ==0:
                print('锅里没有了.....快放丸子')
                self.__con.notify()# 唤醒其他线程
                self.__con.wait() # 自己线程等待其他线程通知

def main():
    con = threading.Condition()
    a = Productor("A",con)
    b = Customer('B',con)
    a.start()
    b.start()
    a.join()
    b.join()
if __name__ == '__main__':
    main()